热门标签 | HotTags
当前位置:  开发笔记 > 大数据 > 正文

多分支集成发布中的常见问题及解决方案探讨

篇首语:本文由编程笔记#小编为大家整理,主要介绍了多分支集成发布各种坑怎么填?相关的知识,希望对你有一定的参考价值。 简介:一文为你详细介绍云效分支模式的原理及实践,云效

篇首语:本文由编程笔记#小编为大家整理,主要介绍了多分支集成发布各种坑怎么填?相关的知识,希望对你有一定的参考价值。


简介:一文为你详细介绍云效分支模式的原理及实践,云效 Flow 这套灵活高效的分支模式可以让用户只关心集成和发布哪些特性分支,而对发布分支创建和管理、分支间合并等一系列工作,托付给云效完成。

小明的研发团队要发布一个版本,这个版本包含了多个功能特性,每个不同的特性之间有较强的独立性。不同的特性由不同的开发人员或开发小组分工完成。

他们在不同的特性分支上开发,彼此相互独立、互不影响。

一个特性开发完成后就提交测试,这个过程不影响其他特性的正常开发,全部已完成的特性全部合并进行测试和发布。在提交测试,集成合并时碰到了这样的问题:


  • 对于某个公共模块的修改出现了合并冲突
  • 由于一个特性分支的集成,导致整个版本集成失败

版本发布时间在即,为不影响整体进展,需要快速分离影响了整个集成的那个特性分支。

如果你是小明,这时你会怎么做?

小明的研发团队又要发布一个版本,整个版本有 A、B、C、D 四个功能特性一起合并集成,分别在分支 A、B、C、D 上开发。临近发布前,市场侧通知由于某种原因功能特性 B 不能发布,也就是这次发布需要剔除分支 B。按照严格的集成发布策略,A、C、D 这 3 个特性分支需要重新构建,分别再经过集成测试、预发验证,然后到生产发布。但是,这样做是有成本的。

如果你是小明,在效率和质量之间你会怎么选?

这两个情景遇到的问题,在多分支并行开发集成发布中很常见,如何快速、灵活、高效又实用地解决这类问题,成为众多小明的刚需。

阿里巴巴集团内部经历并仍在经历着大量多分支集成发布的实践,这些实践被提炼成了一套阿里的分支策略,形成了阿里分支模式,并通过公共云产品云效 Flow 对外部研发用户输出。

当使用云效Flow 分支模式时,小明的两个场景问题将可以得到灵活高效地解决。

场景一:如何快速分离影响整个集成的那个特性分支

小明可以直接在再次运行分支时,删除已集成分支,执行流水线时将会自动进行以下操作:


  • 基于分支管理器中设置的基础分支(如 master),创建新的 release 分支
  • 除了该特性分支外的其他在云效配置中的其他分支合并到 release 分支
  • 基于 release 分支的最新内容运行流水线

场景二:发布在即需求被砍,如何平衡效率和质量?

小明发现云效分支可以按环境/流程,自由地集成,考虑到本次上线的时间对后续项目进度非常关键,小明选择了跳过中间的测试阶段、预发阶段直接部署到正式环境,为了最大程度避免质量风险,小明还使用了云效Flow的发布前人工审核卡点能力,最终变更没有耽误正常发版,也未出现任何风险。

云效 Flow 这套灵活高效的分支模式可以让用户只关心集成和发布哪些特性分支,而对发布分支创建和管理、分支间合并等一系列工作,托付给云效完成。

下面详细介绍云效分支模式原理及实践。


云效 Flow 分支规范


master 代表最新发布版本

一般情况下,master分支代表最新发布版本。当需要最新发布版本的内容时,直接取分支末端即可。

不论其他哪类分支,都建议一般从 master 分支创建,并且经常从 master 分支合并,以便跟上“潮流”,减少将来集成时的各种问题,比如代码合并冲突。

每当软件正式发布前,系统会确保它基于 master 最新。

每当软件正式发布后,系统会把相应内容合并回 master,以便让 master 分支始终代表最新发布版本。

一般来说,使用者不要直接“写”东西到master分支。把“写”的工作交给系统适时自动完成。


在各 feature 分支上开发

一条 feature 分支(又称变更分支、开发分支),通常用来承载一个缺陷的修复,或者一个需求(如果不是很大的话)的开发,或者任务分解后一个任务的开发。

一般来讲,基于 master 分支最新版本创建 feature 分支。然后在 feature 分支上开发、测试,直到这个 feature 功能完成,质量 OK,准备好去集成和发布。


release 分支上的集成

release 分支用于集成和发布。基于 master 分支最新版本创建一条 release 分支,然后把想要集成的各条feature分支合并到这条release分支,进行部署和测试工作。

如果有新的 feature 分支要加入本次集成,那就把它也合并进这条 release 分支,然后再次部署并测试。

如果测试发现问题,就到 feature 分支上修复,然后把它再次合并到 release 分支,把修复带到 release 分支。

当然如果一个 feature 的问题太多太大,那干脆就放弃它。也就是说,新建一条 release 分支,把其他 feature 分支都合并过去,唯独不再合并这条 feature 分支。

就像 master 分支一样,release 分支也是由系统自动管理的。使用者不要直接在上面改代码,代码修改请总是在 feature 分支完成。


release 分支上的发布上线

当 release 分支上的质量足够好,本次想上线的功能也都具备之后,就要考虑发布上线的问题啦。如前面讲的,发布上线前,会确保它基于基础分支(常见的如 master )最新。而发布后会把 release 分支合并回 master,让 master 代表最新发布版本。

以上几节介绍的内容,见下图:


多个环境/流程分支原理

假定要想集成发布上线,要经过日常测试环境上的测试这个流程,还要经过预发环境上的测试这个流程,那么两个流程用一条 release 分支就有些不合适。因为两个流程可能同时在测不同的 feature 分支集合。

分支模式用这个办法避免这个问题:每一个测试环境,也就是每个流程,关联它自己的 release 分支。日常测试、预发测试这两个环境(也就是两个流程),分别关联两条 release 分支。这样就不会相互影响。推而广之,为正式运行环境,也对应一条release分支。也就是说,每个环境都有对应的 release 分支。

当把集成成果从一个环境传递到下一个环境时,就是把一个环境下已合并到一起的 feature 分支,再往另一个环境对应的 release 分支上合并一遍……这么做有点儿笨。对于人工处理这是一个重复操作的过程,云效会帮你自动完成这一系列重复的操作。

对应下图:

以上就是关于分支模式这种研发模式的原理性介绍,以下我们具体看一下如何在云效流水线中使用分支模式。


云效 Flow 分支模式实践


编排流水线

流水线的新建方式其他流水线相同,当新建流水线时选择了「开启分支模式」,就会自动创建包含【分支管理器】的分支模式流水线。

1、新建流水线

2、添加代码源,以使用「云效Codeup」为例,选择代码库,选择「开启分支模式」,然后点击「添加」

3、添加完成后,在「流程配置」页面可以看到第一个阶段「分支管理器」。在分支管理器中设置基础分支,基础分支默认是 master。基础分支是发布分支的创建来源。发布分支从基础分支创建,然后合并运行分支。「分支管理器」只能是在第一个阶段配置,且在这个阶段不能配置并行任务。

若有多版本发布需求,如 1.0,2.0,这里的基础分支可以设置为 master1.0,master2.0,实现多版本发布的流水线。


运行流水线

流水线配置完成后,就可以开始运行了。

1、在运行配置中,添加运行分支。

2、进入添加运行分支对话框,选择运行分支。若在代码源选择的其他代码库,这里输入运行分支。


可以添加多个分支。

3、运行分支添加完成后,就可以开始运行。在「分支管理器」卡片中可以查看执行结果及日志。若合并冲突,需要根据提示解决冲突后继续运行。

通过「源」的「查看分支」或「分支管理器」卡片的「分支详情」可以查看创建的 release 分支及运行分支信息。


4、再次运行时,可以选择继续添加分支或删除已集成分支。

删除已集成分支,执行流水线时将会自动进行以下操作:


  • 基于分支管理器中设置的基础分支(如 master),创建新的 release 分支
  • 除了该特性分支外的其他在云效配置中的其他分支合并到 release 分支
  • 基于 release 分支的最新内容运行流水线

小结

简单来说,Flow 分支模式可以自由地组合特性分支,与各自环境的发布分支做集成。

灵活的特性分支:


  • 分支可以自由地灵活组合。选择任意一个或多个分支进行组合集成。
  • 分支可以灵活地退出,将某个不需要的或有干扰的分支踢出当前集成/环境。
  • 分支可以灵活地加入,将某个需要增加的分支添加到进去。
  • 分支可以按环境/流程,自由地集成,可以跳过中间的测试阶段、预发阶段直接部署到正式环境,这个在紧急修复问题时效率较高。

灵活的特性分支当然也存在着问题,由于可以跳过中间的集成环境/流程,也就带来了未经过验证的代码发布上线的可能性,这时可以考虑使用云效Flow发布前人工卡点的能力,让发布多一层质量保障。

分支策略的选择没有绝对的正确和错误之分,关键是与项目规划、发布节奏相匹配,在实际开发项目中找到一个可以兼顾效率、质量、简单实用的选择。

原文链接

本文为阿里云原创内容,未经允许不得转载。 


推荐阅读
  • 本文详细介绍了如何在Apache Kafka中进行Topic级别的配置,包括创建、修改和删除配置参数的具体步骤,并提供了详细的配置属性表。 ... [详细]
  • 2017年软件开发领域的七大变革
    随着技术的不断进步,2017年对软件开发人员而言将充满挑战与机遇。本文探讨了开发人员需要适应的七个关键变化,包括人工智能、聊天机器人、容器技术、应用程序版本控制、云测试环境、大众开发者崛起以及系统管理的云迁移。 ... [详细]
  • 本文旨在探讨设计模式在Visual FoxPro (VFP) 中的应用可能性。虽然VFP作为一种支持面向对象编程(xbase语言)的工具,其OO特性相对简明,缺乏高级语言如Java、C++等提供的复杂特性,但设计模式作为一种通用的解决方案框架,是否能有效应用于VFP,值得深入研究。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 本文介绍了如何在不同操作系统上安装Git,以及一些基本和高级的Git操作,包括项目初始化、文件状态检查、版本控制、分支管理、标签处理、版本回退等,并简要提及了开源许可协议的选择。 ... [详细]
  • 本文详细介绍了如何调整 Kettle 的内存配置以优化性能,并指导用户如何正确设置日志输出中的时间类型,确保数据处理和监控的准确性。 ... [详细]
  • 在尝试启动Java应用服务器Tomcat时,遇到了org.apache.catalina.LifecycleException异常。本文详细记录了异常的具体表现形式,并提供了有效的解决方案。 ... [详细]
  • 本文介绍如何通过整合SparkSQL与Hive来构建高效的用户画像环境,提高数据处理速度和查询效率。 ... [详细]
  • 本文详细介绍了使用 Selenium 2 进行测试的各种类型和注意事项,包括静态内容测试、链接测试、功能测试、动态元素测试、Ajax 测试以及断言与验证的区别。 ... [详细]
  • 本文详细介绍了 MySQL InnoDB 存储引擎的事务机制,包括 ACID 特性、redo 日志、undo 日志以及 checkpoint 的作用和实现方式。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 在对《供热世界》项目的维护过程中,使用ActivityGroup和Tab进行Activity切换时,发现返回后的Activity列表项点击事件失效。通过分析发现,这是由于Intent中添加了FLAG_ACTIVITY_SINGLE_TOP标志导致的。 ... [详细]
author-avatar
城隍山人因
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有